#ifndef F_OPS_H
#define F_OPS_H 1

#include <tcl.h>

#include "f_core.h"

/** различные операции с объектами
**/
Cons *consIndex(Cons *from,Cons *to,int index,Cons **savePrev);
Cons *consMedian(Tcl_Interp *,Cons *from,Cons *to,Cons **savePrev);

Tcl_Obj *tupleObjFirst(Tcl_Interp *,Tcl_Obj *tupleObj);             // = первый элемента набора
Tcl_Obj *tupleObjLast(Tcl_Interp *,Tcl_Obj *tupleObj);              // = последний элемент набора
Tcl_Obj *tupleObjHead(Tcl_Interp *,Tcl_Obj *tupleObj,int count);    // = набор из count элементов от начала кортежа
Tcl_Obj *tupleObjRest(Tcl_Interp *,Tcl_Obj *tupleObj,int count);    // = набор кроме count элементов от начала кортежа
Tcl_Obj *tupleObjTail(Tcl_Interp *,Tcl_Obj *tupleObj,int count);    // = набор из count элементов от конца кортежа
Tcl_Obj *tupleObjFront(Tcl_Interp *,Tcl_Obj *tupleObj,int count);   // = набор кроме count элементво от конца кортежа
Tcl_Obj *tupleObjRotate(Tcl_Interp *,Tcl_Obj *tupleObj,int count);  // = "вращение" кортежа на count позиций
Tcl_Obj *tupleObjTwin(Tcl_Interp *,Tcl_Obj *tupleObj,int count);    // = сделать из кортежа пару
Tcl_Obj *tupleObjRtwin(Tcl_Interp *,Tcl_Obj *tupleObj,int count);   // = сделать из кортежа обратную пару

Tcl_Obj *tupleObjDoublet(Tcl_Interp *,Tcl_Obj *tupleObj,int count); // разделить набор на пару (список)

Tcl_Obj *tupleObjCat(Tcl_Interp *,Tcl_Obj *tupleObj,int objc,Tcl_Obj *const objv[]);

int firstObjCmd(ClientData,Tcl_Interp *,int objc,Tcl_Obj *const objv[]);
int lastObjCmd(ClientData,Tcl_Interp *,int objc,Tcl_Obj *const objv[]);

int headObjCmd(ClientData,Tcl_Interp *,int objc,Tcl_Obj *const objv[]);
int tailObjCmd(ClientData,Tcl_Interp *,int objc,Tcl_Obj *const objv[]);
int restObjCmd(ClientData,Tcl_Interp *,int objc,Tcl_Obj *const objv[]);
int frontObjCmd(ClientData,Tcl_Interp *,int objc,Tcl_Obj *const objv[]);

int firstObjCmd(ClientData,Tcl_Interp *,int objc,Tcl_Obj *const objv[]);
int lastObjCmd(ClientData,Tcl_Interp *,int objc,Tcl_Obj *const objv[]);

int rotateObjCmd(ClientData,Tcl_Interp *,int objc,Tcl_Obj *const objv[]);
int twinObjCmd(ClientData,Tcl_Interp *,int objc,Tcl_Obj *const objv[]);
int rtwinObjCmd(ClientData,Tcl_Interp *,int objc,Tcl_Obj *const objv[]);

#endif
